home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1997 January: Mac OS SDK / Dev.CD Jan 97 SDK2.toast / Development Kits (Disc 2) / OpenDoc Development Framework / ODFDev / ODF / Found / ODUtils / IText.cpp < prev    next >
Encoding:
C/C++ Source or Header  |  1996-09-17  |  11.5 KB  |  455 lines  |  [TEXT/MPS ]

  1. /*
  2.     File:        IText.cpp
  3.  
  4.     Contains:    Routines for manipulating ITexts.
  5.  
  6.     Owned by:    Vincent Lo
  7.  
  8.     Copyright:    © 1994 - 1996 by Apple Computer, Inc., all rights reserved.
  9.  
  10.     Change History (most recent first):
  11.  
  12.          <4>     6/22/96    EL        1289557: GetITextPString must not write
  13.                                     beyond 255 characters.
  14.          <3>      6/6/96    jpa        Fixed header comment.
  15.          <2>      6/6/96    jpa        T10020: Added InitIText to initialize local
  16.                                     ODIText vars.
  17.  
  18.     To Do:
  19.     
  20.         These could all be rewritten to use the ODByteArray functions,
  21.         thus reducing code size.
  22.  
  23.     In Progress:
  24.         Added InitIText.
  25. */
  26.  
  27. #ifndef _EXCEPT_
  28. #include <Except.h>
  29. #endif
  30.  
  31. #ifndef _UTILERRS_
  32. #include <UtilErrs.h>
  33. #endif
  34.  
  35. #ifndef _ODDEBUG_
  36. #include "ODDebug.h"
  37. #endif
  38.  
  39. #ifndef _ODTYPES_
  40. #include "ODTypes.h"
  41. #endif
  42.  
  43. #ifndef _ITEXT_
  44. #include "IText.h"
  45. #endif
  46.  
  47. #ifndef _BARRAY_
  48. #include "BArray.h"
  49. #endif
  50.  
  51. #ifndef _ODMEMORY_
  52. #include "ODMemory.h"
  53. #endif
  54.  
  55. #include "string.h"
  56.  
  57.  
  58. //==============================================================================
  59. // IText
  60. //==============================================================================
  61.  
  62.  
  63. #if ODDebug
  64.     #define CHECK_FORMAT(I)    ASSERTM((I) && (I)->format==kODTraditionalMacText,    \
  65.                                         kODErrAssertionFailed, "Unknown IText format")
  66. #else
  67.     #define CHECK_FORMAT(I)    if( (I)->format==kODTraditionalMacText ) ;            \
  68.                                 else THROW(kODErrInvalidITextFormat)
  69. #endif
  70.  
  71.  
  72. //------------------------------------------------------------------------------
  73. // NewIText  [static]   Creates an uninitialized empty IText.
  74. //------------------------------------------------------------------------------
  75.     
  76. static ODIText* NewIText( )
  77. {
  78.     return InitIText(new ODIText);
  79. }
  80.  
  81.  
  82. //------------------------------------------------------------------------------
  83. // InitIText
  84. //------------------------------------------------------------------------------
  85.     
  86. ODIText* InitIText( ODIText *itext )
  87. {
  88.     ASSERT_NOT_NULL(itext);
  89.     itext->format = kODTraditionalMacText;
  90.     itext->text._length = 0;
  91.     itext->text._maximum = 0;
  92.     itext->text._buffer = kODNULL;
  93.     return itext;
  94. }
  95.     
  96.     
  97. //------------------------------------------------------------------------------
  98. // CreateITextCString
  99. //------------------------------------------------------------------------------
  100.     
  101. ODIText* CreateITextCString(ODScriptCode scriptCode, ODLangCode langCode, char* text)
  102. {
  103.     ODIText* result = NewIText();
  104.     
  105.     TRY{
  106.         SetITextString(result, text);
  107.         SetITextScriptCode(result, scriptCode);
  108.         SetITextLangCode(result, langCode);
  109.     }CATCH_ALL{
  110.         DisposeIText(result);
  111.         RERAISE;
  112.     }ENDTRY
  113.     
  114.     return result;
  115. }
  116.  
  117.  
  118. //------------------------------------------------------------------------------
  119. // CreateITextPString
  120. //------------------------------------------------------------------------------
  121.  
  122. ODIText* CreateITextPString(ODScriptCode scriptCode, ODLangCode langCode, StringPtr text)
  123. {
  124.     ODIText* result = NewIText();
  125.     
  126.     TRY{
  127.         SetITextString(result, text);
  128.         SetITextScriptCode(result, scriptCode);
  129.         SetITextLangCode(result, langCode);
  130.     }CATCH_ALL{
  131.         DisposeIText(result);
  132.         RERAISE;
  133.     }ENDTRY
  134.     
  135.     return result;
  136. }
  137.  
  138.  
  139. //------------------------------------------------------------------------------
  140. // CreateITextClear
  141. //------------------------------------------------------------------------------
  142.  
  143. ODIText* CreateITextClear(ODScriptCode scriptCode, ODLangCode langCode, ODSize textLen)
  144. {
  145.     ODIText* result = NewIText();
  146.     
  147.     TRY{
  148.         SetITextBufferSize(result, textLen+sizeof(ODTradITextDataHeader), kODFalse);
  149.         SetITextScriptCode(result, scriptCode);
  150.         SetITextLangCode(result, langCode);
  151.     }CATCH_ALL{
  152.         DisposeIText(result);
  153.         RERAISE;
  154.     }ENDTRY
  155.     
  156.     return result;
  157. }
  158.  
  159.  
  160. //------------------------------------------------------------------------------
  161. // CreateIText
  162. //------------------------------------------------------------------------------
  163.  
  164. ODIText*    CreateITextWLen(ODScriptCode scriptCode, ODLangCode langCode,
  165.                         ODUByte* text, ODSize textLength )
  166. {
  167.     ODIText* result = NewIText();
  168.     
  169.     TRY{
  170.         SetITextBufferSize(result,
  171.                             textLength + sizeof(ODTradITextDataHeader), kODFalse);
  172.         ODBlockMove(text,
  173.                     &(((ODTradITextData*)(result->text._buffer))->theText),
  174.                     textLength);
  175.         SetITextScriptCode(result, scriptCode);
  176.         SetITextLangCode(result, langCode);
  177.     }CATCH_ALL{
  178.         DisposeIText(result);
  179.         RERAISE;
  180.     }ENDTRY
  181.     
  182.     return result;
  183. }
  184.  
  185.  
  186. //------------------------------------------------------------------------------
  187. // CopyIText
  188. //------------------------------------------------------------------------------
  189.  
  190. ODIText* CopyIText(ODIText* original)
  191. {
  192.     CHECK_FORMAT(original);
  193.     
  194.     ODIText* result = NewIText();
  195.     
  196.     TRY{
  197.         unsigned long dataSize = original->text._length;
  198.         result->format = original->format;
  199.         result->text._buffer = (octet *)ODNewPtr(dataSize, kDefaultHeapID);
  200.         result->text._maximum = dataSize;
  201.         result->text._length  = dataSize;
  202.         ODBlockMove(original->text._buffer, result->text._buffer, dataSize);
  203.     }CATCH_ALL{
  204.         DisposeIText(result);
  205.         RERAISE;
  206.     }ENDTRY
  207.     
  208.     return result;
  209. }
  210.  
  211. //------------------------------------------------------------------------------
  212. // CopyITextStruct
  213. //------------------------------------------------------------------------------
  214.  
  215. ODIText CopyITextStruct(ODIText* original)
  216. {
  217.     ODIText    result;
  218.  
  219.     CHECK_FORMAT(original);
  220.  
  221.     result.format = original->format;
  222.     result.text = CopyByteArrayStruct(&(original->text));
  223.  
  224.     return result;
  225. }
  226.  
  227.  
  228. //------------------------------------------------------------------------------
  229. // SetITextBufferSize
  230. //------------------------------------------------------------------------------
  231.  
  232. ODIText*
  233. SetITextBufferSize( ODIText* iText, ODSize bufferSize, ODBoolean preserveContents )
  234. {
  235.     // Will create new IText if input is NULL.
  236.     
  237.     if( iText && iText->text._maximum==bufferSize && iText->text._buffer ) {
  238.         iText->text._length = bufferSize;
  239.         return iText;                        // No-op
  240.     }
  241.     
  242.     ODTradITextData *buffer = (ODTradITextData*) ODNewPtr(bufferSize);
  243.     if( !iText ) {
  244.         TRY{
  245.             iText = NewIText();
  246.         }CATCH_ALL{
  247.             ODDisposePtr(buffer);
  248.             RERAISE;
  249.         }ENDTRY
  250.     } else if( iText->text._buffer ) {
  251.         if( preserveContents )
  252.             ODBlockMove(iText->text._buffer, buffer, bufferSize);
  253.         ODDisposePtr(iText->text._buffer);
  254.     }
  255.     iText->text._buffer = (octet*) buffer;
  256.     iText->text._maximum = bufferSize;
  257.     iText->text._length = bufferSize;
  258.     return iText;
  259. }
  260.  
  261.  
  262. //------------------------------------------------------------------------------
  263. // GetITextPtr
  264. //------------------------------------------------------------------------------
  265.  
  266. char* GetITextPtr( ODIText *iText )
  267. {
  268.     CHECK_FORMAT(iText);
  269.     return ((ODTradITextData*)iText->text._buffer)->theText;
  270. }
  271.  
  272.  
  273. //------------------------------------------------------------------------------
  274. // SetITextScriptCode
  275. //------------------------------------------------------------------------------
  276.  
  277. void SetITextScriptCode(ODIText* iText, ODScriptCode scriptCode)
  278. {
  279.     CHECK_FORMAT(iText);
  280.     ODTradITextData *data = (ODTradITextData*) iText->text._buffer;
  281.     data->theScriptCode = scriptCode;
  282. }
  283.  
  284.  
  285. //------------------------------------------------------------------------------
  286. // GetITextScriptCode
  287. //------------------------------------------------------------------------------
  288.  
  289. ODScriptCode GetITextScriptCode(ODIText* iText)
  290. {
  291.     CHECK_FORMAT(iText);
  292.     ODTradITextData *data = (ODTradITextData*) iText->text._buffer;
  293.     return data->theScriptCode;
  294. }
  295.  
  296.  
  297. //------------------------------------------------------------------------------
  298. // SetITextLangCode
  299. //------------------------------------------------------------------------------
  300.  
  301. void SetITextLangCode(ODIText* iText, ODLangCode langCode)
  302. {
  303.     CHECK_FORMAT(iText);
  304.     ODTradITextData *data = (ODTradITextData*) iText->text._buffer;
  305.     data->theLangCode = langCode;
  306. }
  307.  
  308.  
  309. //------------------------------------------------------------------------------
  310. // GetITextLangCode
  311. //------------------------------------------------------------------------------
  312.  
  313. ODLangCode GetITextLangCode(ODIText* iText)
  314. {
  315.     CHECK_FORMAT(iText);
  316.     ODTradITextData *data = (ODTradITextData*) iText->text._buffer;
  317.     return data->theLangCode;
  318. }
  319.  
  320.  
  321. //------------------------------------------------------------------------------
  322. // SetITextStringLength
  323. //------------------------------------------------------------------------------
  324.  
  325. ODIText* SetITextStringLength( ODIText* iText, ODSize length, ODBoolean preserveText )
  326. {
  327.     ODTradITextDataHeader data = {0,0};
  328.     if( iText ) {
  329.         CHECK_FORMAT(iText);
  330.         if( iText->text._buffer )
  331.             data = * (ODTradITextDataHeader*) iText->text._buffer;
  332.     }
  333.     iText = SetITextBufferSize(iText,length+sizeof(ODTradITextDataHeader),preserveText);
  334.     if( !preserveText )
  335.         * (ODTradITextDataHeader*) iText->text._buffer = data;
  336.     return iText;
  337. }
  338.  
  339.  
  340. //------------------------------------------------------------------------------
  341. // GetITextStringLength
  342. //------------------------------------------------------------------------------
  343.  
  344. ODULong GetITextStringLength(ODIText* iText)
  345. {
  346.     CHECK_FORMAT(iText);
  347.     if( iText->text._buffer )
  348.         return iText->text._length - sizeof(ODTradITextDataHeader);
  349.     else
  350.         return 0;
  351. }
  352.  
  353.  
  354. //------------------------------------------------------------------------------
  355. // SetITextCString
  356. //------------------------------------------------------------------------------
  357.  
  358. void SetITextCString(ODIText* iText, char* text)
  359. {
  360.     CHECK_FORMAT(iText);
  361.     ODSize textLen = text ?strlen(text) :0;
  362.     SetITextStringLength(iText,textLen,kODFalse);
  363.     ODBlockMove(text, ((ODTradITextData*)iText->text._buffer)->theText, textLen);
  364. }    
  365.  
  366.  
  367. //------------------------------------------------------------------------------
  368. // SetITextPString
  369. //------------------------------------------------------------------------------
  370.  
  371. void SetITextPString(ODIText* iText, StringPtr text)
  372. {
  373.     CHECK_FORMAT(iText);
  374.     ODSize textLen = text ?text[0] :0;
  375.     SetITextStringLength(iText,textLen,kODFalse);
  376.     ODBlockMove(&text[1], ((ODTradITextData*)iText->text._buffer)->theText, textLen);
  377. }    
  378.  
  379.  
  380. //------------------------------------------------------------------------------
  381. // SetITextText
  382. //------------------------------------------------------------------------------
  383.  
  384. void SetITextText(ODIText* iText, ODUByte* text, ODSize textLength)
  385. {
  386.     CHECK_FORMAT(iText);
  387.     SetITextStringLength(iText, textLength, kODFalse);
  388.     ODBlockMove(text, ((ODTradITextData*)iText->text._buffer)->theText,
  389.                 textLength);
  390. }    
  391.  
  392.  
  393. //------------------------------------------------------------------------------
  394. // GetITextCString
  395. //------------------------------------------------------------------------------
  396.  
  397. char* GetITextCString(ODIText* iText, char *cstring)
  398. {
  399.     CHECK_FORMAT(iText);
  400.     ODSize len;
  401.     if( iText->text._buffer )
  402.         len = iText->text._length - sizeof(ODTradITextDataHeader);
  403.     else
  404.         len = 0;
  405.         
  406.     if( !cstring )
  407.         cstring = new char[len+1];
  408.     cstring[len] = '\0';
  409.     if( len )
  410.         ODBlockMove(((ODTradITextData*)iText->text._buffer)->theText,
  411.                     cstring, len);
  412.     return cstring;
  413. }
  414.  
  415.  
  416. //------------------------------------------------------------------------------
  417. // GetITextPString
  418. //------------------------------------------------------------------------------
  419.  
  420. StringPtr GetITextPString(ODIText* iText, Str255 pstring)
  421. {
  422.     CHECK_FORMAT(iText);
  423.     ODSize len;
  424.     if( iText->text._buffer ) {
  425.         len = iText->text._length - sizeof(ODTradITextDataHeader);
  426.         if (len > 255)
  427.             len = 255;
  428.     }
  429.     else
  430.         len = 0;
  431.         
  432.     if( !pstring )
  433.         pstring = new unsigned char[len+1];
  434.     if( len )
  435.         ODBlockMove(((ODTradITextData*)iText->text._buffer)->theText,
  436.                     &pstring[1], len);
  437.     pstring[0] = len;
  438.     return pstring;
  439. }
  440.  
  441.  
  442. //------------------------------------------------------------------------------
  443. // DisposeIText
  444. //------------------------------------------------------------------------------
  445.  
  446. void DisposeIText(ODIText* iText)
  447. {
  448.     if( iText ) {
  449.         CHECK_FORMAT(iText);
  450.         DisposeITextStruct(*iText);
  451.         delete iText;
  452.     }
  453. }
  454.  
  455.